/*
 * @Author: lixu lixu@puchigames.com
 * @Date: 2025-09-18 11:00:00
 * @LastEditors: lixu lixu@puchigames.com
 * @LastEditTime: 2025-09-18 11:00:00
 * @FilePath: /go-helper/ixLog/types.go
 * @Description: 日志系统类型定义，包含日志级别、配置、输出格式等核心类型
 */

package ixLog

import (
	"context"
	"io"
	"time"
)

// LogLevel 日志级别
type LogLevel int

const (
	TRACE LogLevel = iota // 调用链追踪，最细粒度
	DEBUG                 // 调试信息
	INFO                  // 一般信息
	WARN                  // 警告信息
	ERROR                 // 错误信息
	FATAL                 // 致命错误
)

// String 返回日志级别的字符串表示
func (l LogLevel) String() string {
	switch l {
	case TRACE:
		return "TRACE"
	case DEBUG:
		return "DEBUG"
	case INFO:
		return "INFO"
	case WARN:
		return "WARN"
	case ERROR:
		return "ERROR"
	case FATAL:
		return "FATAL"
	default:
		return "UNKNOWN"
	}
}

// Color 返回日志级别对应的颜色代码
func (l LogLevel) Color() string {
	switch l {
	case TRACE:
		return "\033[37m" // 白色
	case DEBUG:
		return "\033[36m" // 青色
	case INFO:
		return "\033[32m" // 绿色
	case WARN:
		return "\033[33m" // 黄色
	case ERROR:
		return "\033[31m" // 红色
	case FATAL:
		return "\033[35m" // 紫色
	default:
		return "\033[0m" // 默认
	}
}

// OutputFormat 输出格式
type OutputFormat int

const (
	TextFormat   OutputFormat = iota // 文本格式
	JSONFormat                       // JSON格式
	CustomFormat                     // 自定义格式
)

// OutputTarget 输出目标类型
type OutputTarget int

const (
	ConsoleTarget OutputTarget = iota // 控制台
	FileTarget                        // 文件
	NetworkTarget                     // 网络
	CustomTarget                      // 自定义
)

// RotationPolicy 日志轮转策略
type RotationPolicy int

const (
	NoRotation   RotationPolicy = iota // 不轮转
	SizeRotation                       // 按大小轮转
	TimeRotation                       // 按时间轮转
	BothRotation                       // 按大小和时间轮转
)

// LogEntry 日志条目
type LogEntry struct {
	Timestamp    time.Time              `json:"timestamp"`                // 时间戳
	Level        LogLevel               `json:"level"`                    // 日志级别
	Message      string                 `json:"message"`                  // 日志消息
	Fields       map[string]interface{} `json:"fields,omitempty"`         // 附加字段
	TraceID      string                 `json:"trace_id,omitempty"`       // 追踪ID
	SpanID       string                 `json:"span_id,omitempty"`        // 跨度ID
	ParentSpanID string                 `json:"parent_span_id,omitempty"` // 父跨度ID
	Caller       *CallerInfo            `json:"caller,omitempty"`         // 调用者信息
	Stack        []string               `json:"stack,omitempty"`          // 调用栈
	Error        error                  `json:"error,omitempty"`          // 错误信息
}

// CallerInfo 调用者信息
type CallerInfo struct {
	File     string `json:"file"`     // 文件路径
	Line     int    `json:"line"`     // 行号
	Function string `json:"function"` // 函数名
}

// Config 日志配置
type Config struct {
	// 基础配置
	Level          LogLevel     `json:"level" yaml:"level"`                     // 最小日志级别
	Format         OutputFormat `json:"format" yaml:"format"`                   // 输出格式
	EnableColor    bool         `json:"enable_color" yaml:"enable_color"`       // 启用颜色
	EnableCaller   bool         `json:"enable_caller" yaml:"enable_caller"`     // 启用调用者信息
	CallerSkip     int          `json:"caller_skip" yaml:"caller_skip"`         // 调用者跳过层数
	TimeFormat     string       `json:"time_format" yaml:"time_format"`         // 时间格式
	Timezone       string       `json:"timezone" yaml:"timezone"`               // 时区
	CustomTemplate string       `json:"custom_template" yaml:"custom_template"` // 自定义模板

	// 输出配置
	Outputs       []OutputConfig `json:"outputs" yaml:"outputs"`               // 输出配置列表
	EnableAsync   bool           `json:"enable_async" yaml:"enable_async"`     // 启用异步输出
	BufferSize    int            `json:"buffer_size" yaml:"buffer_size"`       // 缓冲区大小
	FlushInterval time.Duration  `json:"flush_interval" yaml:"flush_interval"` // 刷新间隔

	// 追踪配置
	EnableTrace bool    `json:"enable_trace" yaml:"enable_trace"` // 启用追踪
	StackDepth  int     `json:"stack_depth" yaml:"stack_depth"`   // 调用栈深度
	SampleRate  float64 `json:"sample_rate" yaml:"sample_rate"`   // 采样率

	// 全局字段
	GlobalFields map[string]interface{} `json:"global_fields" yaml:"global_fields"` // 全局字段
	AppName      string                 `json:"app_name" yaml:"app_name"`           // 应用名称
	Environment  string                 `json:"environment" yaml:"environment"`     // 环境
	Hostname     string                 `json:"hostname" yaml:"hostname"`           // 主机名

	// 安全配置
	EnableSanitize   bool     `json:"enable_sanitize" yaml:"enable_sanitize"`     // 启用脱敏
	SanitizeFields   []string `json:"sanitize_fields" yaml:"sanitize_fields"`     // 需要脱敏的字段
	SanitizePatterns []string `json:"sanitize_patterns" yaml:"sanitize_patterns"` // 脱敏正则表达式

	// 钩子配置
	EnableHooks bool `json:"enable_hooks" yaml:"enable_hooks"` // 启用钩子
}

// OutputConfig 输出配置
type OutputConfig struct {
	Type   OutputTarget `json:"type" yaml:"type"`     // 输出类型
	Enable bool         `json:"enable" yaml:"enable"` // 是否启用
	Writer io.Writer    `json:"-" yaml:"-"`           // 写入器

	// 文件输出配置
	FilePath   string         `json:"file_path" yaml:"file_path"`     // 文件路径
	Rotation   RotationPolicy `json:"rotation" yaml:"rotation"`       // 轮转策略
	MaxSize    int64          `json:"max_size" yaml:"max_size"`       // 最大文件大小(MB)
	MaxAge     int            `json:"max_age" yaml:"max_age"`         // 最大保留天数
	MaxBackups int            `json:"max_backups" yaml:"max_backups"` // 最大备份数量
	Compress   bool           `json:"compress" yaml:"compress"`       // 是否压缩

	// 网络输出配置
	Network string        `json:"network" yaml:"network"` // 网络类型(tcp/udp)
	Address string        `json:"address" yaml:"address"` // 网络地址
	Timeout time.Duration `json:"timeout" yaml:"timeout"` // 超时时间

	// 自定义输出配置
	CustomWriter io.Writer `json:"-" yaml:"-"` // 自定义写入器
}

// Hook 钩子接口
type Hook interface {
	// Fire 触发钩子
	Fire(entry *LogEntry) error
	// Levels 返回钩子关注的日志级别
	Levels() []LogLevel
}

// Formatter 格式化器接口
type Formatter interface {
	// Format 格式化日志条目
	Format(entry *LogEntry) ([]byte, error)
}

// Writer 写入器接口
type Writer interface {
	io.Writer
	// Close 关闭写入器
	Close() error
	// Sync 同步缓冲区
	Sync() error
}

// TraceContext 追踪上下文
type TraceContext struct {
	TraceID      string                 `json:"trace_id"`
	SpanID       string                 `json:"span_id"`
	ParentSpanID string                 `json:"parent_span_id,omitempty"`
	Baggage      map[string]interface{} `json:"baggage,omitempty"`
}

// Logger 日志器接口
type Logger interface {
	// 基础日志方法
	Trace(args ...interface{})
	Tracef(format string, args ...interface{})
	Debug(args ...interface{})
	Debugf(format string, args ...interface{})
	Info(args ...interface{})
	Infof(format string, args ...interface{})
	Warn(args ...interface{})
	Warnf(format string, args ...interface{})
	Error(args ...interface{})
	Errorf(format string, args ...interface{})
	Fatal(args ...interface{})
	Fatalf(format string, args ...interface{})

	// 上下文方法
	WithContext(ctx context.Context) Logger
	WithField(key string, value interface{}) Logger
	WithFields(fields map[string]interface{}) Logger
	WithError(err error) Logger
	WithTrace(traceID, spanID, parentSpanID string) Logger

	// 配置方法
	SetLevel(level LogLevel)
	GetLevel() LogLevel
	IsLevelEnabled(level LogLevel) bool

	// 控制方法
	Flush() error
	Close() error

	// 钩子方法
	AddHook(hook Hook)
	RemoveHook(hook Hook)
}

// Stats 日志统计信息
type Stats struct {
	TotalEntries   int64              `json:"total_entries"`   // 总日志条数
	LevelCounts    map[LogLevel]int64 `json:"level_counts"`    // 各级别日志统计
	ErrorCount     int64              `json:"error_count"`     // 错误计数
	DroppedEntries int64              `json:"dropped_entries"` // 丢弃的日志条数
	BufferSize     int                `json:"buffer_size"`     // 缓冲区大小
	BufferUsage    int                `json:"buffer_usage"`    // 缓冲区使用量
	LastFlush      time.Time          `json:"last_flush"`      // 最后刷新时间
	Uptime         time.Duration      `json:"uptime"`          // 运行时间
}

// SanitizeRule 脱敏规则
type SanitizeRule struct {
	Field   string `json:"field"`   // 字段名
	Pattern string `json:"pattern"` // 正则表达式
	Replace string `json:"replace"` // 替换内容
}

// ContextKey 上下文键类型
type ContextKey string

const (
	TraceContextKey  ContextKey = "trace_context"
	LoggerContextKey ContextKey = "logger"
)

// 默认配置常量
const (
	DefaultTimeFormat    = "2006-01-02 15:04:05.000"
	DefaultBufferSize    = 1024
	DefaultFlushInterval = 1 * time.Second
	DefaultStackDepth    = 5
	DefaultSampleRate    = 1.0
	DefaultCallerSkip    = 2
	DefaultMaxSize       = 100 // MB
	DefaultMaxAge        = 30  // days
	DefaultMaxBackups    = 10
)

// 颜色重置码
const ColorReset = "\033[0m"
